package co.edu.uniandes.sd.mundo;

import java.io.IOException;
import java.io.StringWriter;
import java.util.Enumeration;

import net.jxta.document.Advertisement;
import net.jxta.document.AdvertisementFactory;
import net.jxta.document.Document;
import net.jxta.document.Element;
import net.jxta.document.MimeMediaType;
import net.jxta.document.StructuredDocument;
import net.jxta.document.StructuredDocumentFactory;
import net.jxta.document.StructuredDocumentUtils;
import net.jxta.document.StructuredTextDocument;
import net.jxta.document.TextElement;
import net.jxta.id.ID;
import net.jxta.protocol.PipeAdvertisement;

public class AdvertisementModificacion extends Advertisement{

	private final static String mimeType= "text/xml";
	
	public final static String TIPO_ADVERTISEMENT="advertisementModificacion";
	
	public final static String IDENTIFICADOR_TAG ="Identificador";
	
	public final static String TIMESTAMP_TAG="Timestamp";
	
	/**
	 * Identificador del archivo sobre el cual se desean realizar modificaciones
	 */
	private String identificadorArchivo;
	
	/**
	 * Advertisement del pipe para el envio de mensajes
	 */
	private PipeAdvertisement pipeAdvertisement;
	
	/**
	 * Estampa de tiempo con la creacion del advertisement
	 */
	private long timestamp;
	
	public AdvertisementModificacion(){
		super();
	}
	
	public AdvertisementModificacion(Element el){
		super();
		readAdvertisement((TextElement)el);
	}
	
	
	public String getIdentificadorArchivo() {
		return identificadorArchivo;
	}

	public void setIdentificadorArchivo(String identificadorArchivo) {
		this.identificadorArchivo = identificadorArchivo;
	}

	public long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(long timestamp) {
		this.timestamp = timestamp;
	}

	public PipeAdvertisement getPipeAdvertisement() {
		return pipeAdvertisement;
	}

	public void setPipeAdvertisement(PipeAdvertisement pipeAdvertisement) {
		this.pipeAdvertisement = pipeAdvertisement;
	}

	public static String getAdvertisementType(){
		return TIPO_ADVERTISEMENT;
	}
	
	public Document getDocument(MimeMediaType asMimeType) throws IllegalArgumentException
    {
        if((null!= getIdentificadorArchivo()) && (null!= getPipeAdvertisement()))
        {
            StructuredDocument document= (StructuredDocument) StructuredDocumentFactory.newStructuredDocument(asMimeType, getAdvertisementType());
            Element element;

            //añadir hijos al documento:

            element= document.createElement(IDENTIFICADOR_TAG, getIdentificadorArchivo());
            document.appendChild(element);
            element= document.createElement(TIMESTAMP_TAG, ""+getTimestamp());
            document.appendChild(element);
            PipeAdvertisement pipe = getPipeAdvertisement();
            if(pipe!=null){
                StructuredTextDocument advDoc = (StructuredTextDocument) pipe.getDocument(asMimeType);
                StructuredDocumentUtils.copyElements(document, document, advDoc);
            }


            return document;
        }
        else
        {
            throw new IllegalArgumentException("faltan datos para hacer advert");
        }
    }

	@Override
	public ID getID() {
		// TODO Cambiar a un ID valido
		return ID.nullID;
	}

	@Override
	public String[] getIndexFields() {
		return new String[]{IDENTIFICADOR_TAG,TIMESTAMP_TAG};
	}
	
	public void readAdvertisement(TextElement document)throws IllegalArgumentException
    {
        if(document.getName().equals(getAdvertisementType()))
        {
            Enumeration elements= document.getChildren();

            while(elements.hasMoreElements())
            {
                TextElement element= (TextElement) elements.nextElement();

                if(element.getName().equals(PipeAdvertisement.getAdvertisementType()))
                {
                    PipeAdvertisement pipe = (PipeAdvertisement) AdvertisementFactory.newAdvertisement(element);

                    setPipeAdvertisement(pipe);
                    continue;
                }

                 if(element.getName().equals(IDENTIFICADOR_TAG))
                {
                    setIdentificadorArchivo(element.getTextValue());
                    continue;
                }
                 
                 if(element.getName().equals(TIMESTAMP_TAG))
                 {
                     setTimestamp(Long.parseLong(element.getTextValue()));
                     continue;
                 }
            }
        }
        else
        {
            throw new IllegalArgumentException("no es el advertisement de recurso");
        }
    }
	
    public String toString()
    {
        try {
            StringWriter out = new StringWriter();
            StructuredTextDocument doc = (StructuredTextDocument) getDocument(new MimeMediaType(mimeType));
            doc.sendToWriter(out);
            return out.toString();
        } catch (IOException ex) {
            ex.printStackTrace();
            return "";
        }
    }
}
